++) make_exp_frag_ang(OD_SMFRAG1+(rand()&3),m->x,(-(rand()&0x7f) )<<16,m->z+( (-0x100+(rand()&0x1ff) )<<16),ang); ang^=0x400; for(i=0;i<4;i++)make_exp_frag_ang(OD_SMFRAG1+(rand()&3), m->x, (-(rand()&0x7f) )<<16,m->z+( (-0x100+(rand()&0x1ff) )<<16),ang); create_item_ang(OD_12MGATE3,m->x,m->y- (0x5c <<16),m->z-((0x60+0xc0)<<16) ,0 ); create_item_ang(OD_12MGATE2,m->x,m->y- (0x5c <<16),m->z- (0x60 <<16) ,0 ); create_item_ang(OD_12MGATE2,m->x,m->y- (0x5c <<16),m->z+ (0x60 <<16) ,0 ); create_item_ang(OD_12MGATE4,m->x,m->y- (0x5c <<16),m->z+((0x60+0xc0)<<16) ,0 ); create_item_ang(OD_12MGATE3,m->x,m->y-((0x5c+0xb8)<<16),m->z-((0x60+0xc0)<<16) ,0 ); create_item_ang(OD_12MGATE2,m->x,m->y-((0x5c+0xb8)<<16),m->z- (0x60 <<16) ,0 ); create_item_ang(OD_12MGATE2,m->x,m->y-((0x5c+0xb8)<<16),m->z+ (0x60 <<16) ,0 ); create_item_ang(OD_12MGATE4,m->x,m->y-((0x5c+0xb8)<<16),m->z+((0x60+0xc0)<<16) ,0 ); } return(2); //1); } int brk_handler_drink_machine(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr) { int i,t; int x,y,z; int x2,z2,y2; static int sodacnt=0; MOB *mp; //static short soda_xa[4]={0xc000+0x300,0xc000-0xf00,0xc000+0x1500,0xc000-0x1e00}; static short soda_xa[4]={0xc000+0x300,0xc000-0x00,0xc000+0x1500,0xc000+0x700}; int xa; if(manptr) xa=manptr->xa; else xa=0; t=m->type; if(t==OD_DRKMCH2D) return(2); if(t==OD_DRKF2EX2) return(2); m->cnt=16; //create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]); for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa); if(dp[3]) play_sfx(SMP_MP_FH ,192,0x1800); else play_sfx(SMP_HAWK_P1,255,0x1800); play_sfx(SMP_21SUSP,96,0x1800); player_rumble (manptr,RFX_CHUG); if(--brk->hp<0) { play_sfx(SMP_CAR_DAM2,160,0x1a00 + (rand() & 0x1ff)); m->type++; brk->hp+=2; if(t==OD_DRNKFNTN) brk->hp+=4-2; if(t==OD_INFOCNTR) { if (manptr) manptr->ndestruct++; m->type=OD_DRKMCH2D; for(i=0;i<2;i++) { make_exp_frag_ang(OD_SMFRAG1+(rand()&3),m->x,-0x40<<16,m->z,0x3000>>5); make_exp_frag_ang(OD_SMFRAG1+(rand()&3),m->x,-0x40<<16,m->z,0x5000>>5); } dual_rumble (RFX_EXP); i=create_weapon(OD_INFOSCRN,m->x,-0x70<<16,m->z,0xc000-0x1000+(rand()&0x1fff) ); mp=&items[i]; mp->spd=64+(rand()&15); mp->ysp=96+(rand()&15); m->aux=0x300+(rand()&0x3ff); mp->flg=1; // No-detect flag. // i=create_weapon(OD_IRONBAR1,m->x,-0x50<<16,m->z); // mp=&items[i]; // mp->spd=48; // mp->ysp=96; // mp->xa=0xc000-0x1000+(rand()&0x1fff); // mp->flg=1; // No-detect flag. } t=m->type; x=m->x; y=0; z=m->z; if(t==OD_DRKMCH2D) { if (manptr) manptr->ndestruct++; m->cnt=16; m->cnt=0; m->aux=30*8; for(i=0;i<2;i++) { make_exp_frag_ang(OD_SMFRAG1+(rand()&3),m->x,-0x40<<16,m->z,0x3000>>5); make_exp_frag_ang(OD_SMFRAG1+(rand()&3),m->x,-0x40<<16,m->z,0x5000>>5); } for(i=0;i<32;i++) { x2=(-0x40+(rand()&0x7f) ) <<16; z2=(-0x40+(rand()&0x7f) ) <<16; y2= -0x40+(rand()&0x7f); create_dust(OD_DUST,x+x2,(-0xa0-y2)<<16,z+z2 ,0,0,0); } i=create_weapon(OD_IRONBAR1,m->x,-0x50<<16,m->z, 0xc000-0x1000+(rand()&0x1fff) ); mp=&items[i]; mp->spd=70+(rand()&15); mp->ysp=96+(rand()&15); mp->flg=1; // No-detect flag. } else if(t==OD_DRKF2EX2) { if (manptr) manptr->ndestruct++; m->cnt=0; m->aux=30*8; for(i=0;i<2;i++) { make_exp_frag_ang(OD_SMFRAG1+(rand()&3),m->x,-0x40<<16,m->z,0x3000>>5); make_exp_frag_ang(OD_SMFRAG1+(rand()&3),m->x,-0x40<<16,m->z,0x5000>>5); } for(i=0;i<32;i++) { x2=(-0x40+(rand()&0x7f) ) <<16; z2=(-0x40+(rand()&0x7f) ) <<16; y2= -0x40+(rand()&0x7f); create_dust(OD_DUST,x+x2,(-0xa0-y2)<<16,z+z2 ,0,0,0); } i=create_weapon(OD_IRONBAR1,m->x,-0x50<<16,m->z, 0xc000-0x1000+(rand()&0x1fff) ); mp=&items[i]; mp->spd=70+(rand()&15); mp->ysp=96+(rand()&15); mp->flg=1; // No-detect flag. } el-(0x40<<15),z-(0x20<<15),0x00); make_glass2_frag(x ,y-(0x40<<15),z-(0x20<<15),0x00); make_glass2_frag(x+(0x30<<15),y-(0x40<<15),z-(0x20<<15),0x00); make_glass2_frag(x-(0x30<<15),y ,z-(0x20<<15),0x00); make_glass2_frag(x ,y ,z-(0x20<<15),0x00); make_glass2_frag(x+(0x30<<15),y ,z-(0x20<<15),0x00); make_glass2_frag(x-(0x30<<15),y+(0x40<<15),z-(0x20<<15),0x00); make_glass2_frag(x ,y+(0x40<<15),z-(0x20<<15),0x00); make_glass2_frag(x+(0x30<<15),y+(0x40<<15),z-(0x20<<15),0x00); } return(1); } int brk_handler_gate11(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr) { MOB *n; int i,x,z; spcbrk[1]=brk; // Need this for later, to reset det-box!! m->cnt=8; // shakes the gate. play_sfx(SMP_HIT_MSHT, 0xff, 0x1800); player_rumble (manptr,RFX_CHUG); if(sublev!=1) { brk->hp=4; create_hitspr(OD_BLOCK,dp[X],dp[Y],dp[Z]); return(1); } if(brk->hp<0) { brk->dtype=BRK_NULL; m->type=OD_STG1GTE2; x=m->x; z=m->z; play_sfx(SMP_EXPLO1,255,0x1800); create_fx(OD_EXP1,x,dp[Y],z); create_fx(OD_BLAST1,m->x,0,m->z); shaker=16; eflash=8; //16; i=create_item(OD_STG1GTE3,x,0,z); n=&items[i]; n->spd=0x1c0+(rand()&0x3f); n->xa=0xc00; i=create_item(OD_STG1GTE4,x,0,z); n=&items[i]; n->spd=0x200+(rand()&0x3f); n->xa=-0xc00; baddie_pause = 0; return(1); } //create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]); if(brk->hp>=3) m->type=OD_STG1GATE; else if(brk->hp>=2) m->type=OD_STG1GTE5; else if(brk->hp>=1) m->type=OD_STG1GTE6; else m->type=OD_STG1GTE7; if(--brk->hp<0) { brk->hp=0; brk->dtype=BRK_NULL; if (manptr) manptr->ndestruct++; m->type=OD_STG1GTE7f; m->cnt=0; m->aux=0; baddie_pause = 0; } return(1); } int brk_handler_gate12(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr) { int i; int x,y,z; int ang; m->cnt=8; // shakes the gate. if(sublev!=1) { brk->hp=4; //create_hitspr(OD_BLOCK,dp[X],-32<<16,dp[Z]); return(1); } //create_hitspr(OD_HIT,dp[X],-32<<16,dp[Z]); play_sfx(SMP_HIT_MSHT,255,0x1800); play_sfx(SMP_21SUSP,160,0x1800); player_rumble (manptr,RFX_CHUG); if(--brk->hp<0) { brk->hp=0; brk->dtype=BRK_NULL; x=m->x; y=m->y; z=m->z; m->type=OD_NULL; m->cnt=0; m->aux=0; if (manptr) manptr->ndestruct++; play_sfx(SMP_MET_SHUT,255,0x1800); play_sfx(SMP_EXPLO1,96,0x1800); shaker=8; eflash=4; dual_rumble (RFX_SHUDDER); ang=0x000>>5; for(i=0;i<8;i++) make_exp_frag_ang(OD_SMFRAG1+(rand()&3),x+( (-0x100+(rand()&0x1ff) )<<16),(-(rand()&0x7f) )<<16,z,ang); ang^=0x400; for(i=0;i<4;i++) make_exp_frag_ang(OD_SMFRAG1+(rand()&3),x+( (-0x100+(rand()&0x1ff) )<<16),(-(rand()&0x7f) )<<16,z,ang); create_item_ang(OD_12GATE6,x-((0x64+0xc8)<<16),- (0x5c <<16),z ,0 ); create_item_ang(OD_12GATE6,x- (0x64 <<16),- (0x5c <<16),z ,0 ); create_item_ang(OD_12GATE6,x+ (0x64 <<16),- (0x5c <<16),z ,0 ); create_item_ang(OD_12GATE6,x+((0x64+0xc8)<<16),- (0x5c <<16),z ,0 ); create_item_ang(OD_12GATE5,x-((0x64+0xc8)<<16),-((0x5c+0xb8)<<16),z ,0 ); create_item_ang(OD_12GATE5,x- (0x64 <<16),-((0x5c+0xb8)<<16),z ,0 ); create_item_ang(OD_12GATE5,x+ (0x64 <<16),-((0x5c+0xb8)<<16),z ,0 ); create_item_ang(OD_12GATE5,x+((0x64+0xc8)<<16),-((0x5c+0xb8)<<16),z ,0 ); } return(1); } int brk_handler_mgate12(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr) { int i; int ang; m->cnt=8; // shakes the gate. //create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]); play_sfx(SMP_HIT_MSHT,255,0x1800); play_sfx(SMP_21SUSP,160,0x1800); player_rumble (manptr,RFX_CHUG); if(--brk->hp<0) { brk->hp=0; brk->dtype=BRK_NULL; m->type=OD_12MGATE1d; m->cnt=0; m->aux=0; if (manptr) manptr->ndestruct++; play_sfx(SMP_MET_SHUT,255,0x1800); play_sfx(SMP_EXPLO1,96,0x1800); shaker=8; eflash=4; dual_rumble (RFX_SHUDDER); ang=0x4000>>5; if(m->x<0) ang^=0x400; for(i=0;i<8;iXP; if(t==OD_61TANK3) m->type=OD_11JEEPEXP; if(t==OD_BLAKHAWK) return(2); m->ysp=-128; m->cnt=1; // m->spd-=m->spd>>2; if (manptr) manptr->ndestruct++; play_sfx(SMP_EXPLO1,255,0x1800); create_fx(OD_EXP1,m->x,dp[Y],m->z); create_fx(OD_BLAST1,m->x,0,m->z); for(i=0;i<16;i++) make_exp_frag_ang(OD_WRECK1+(rand()&3),m->x,m->y,m->z,m->xa>>5); shaker=16; eflash=8; return(2); } //create_hitspr(OD_BLOCK,dp[X],dp[Y],dp[Z]); for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa); if(dp[3]) play_sfx(SMP_MP_FH ,192,0x1800); else play_sfx(SMP_HAWK_P1,255,0x1800); return(2); } int brk_handler_11van(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr) { int i,t; int x,y,z,ang; int rockx,rockz; int dq[4]; int xa; if(manptr) xa=manptr->xa; else xa=0; player_rumble (manptr,RFX_CHUG); if(brk->hp<0) { if (manptr) manptr->ndestruct++; brk->dtype=BRK_SOLID; m->type=OD_VAN2EXP; m->ysp=-128; m->cnt=1; m++; m->type=OD_SCORCH; stop_sfx(m->sfx); play_sfx(SMP_EXPLO1,255,0x1800); create_fx(OD_EXP1,m->x,dp[Y],m->z); create_fx(OD_BLAST1,m->x,0,m->z); for(i=0;i<16;i++) make_exp_frag(OD_WRECK1+(rand()&3),m->x,m->y,m->z); shaker=16; eflash=8; //16; return(2); } //create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]); for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa); t=m->type; if(dp[3]) play_sfx(SMP_MP_FH ,192,0x1800); else play_sfx(SMP_HAWK_P1,255,0x1800); /* rockx=0x300; rockz=0x600; if(gaside==0) m->aux= rockx; if(gaside==1) m->cnt= rockz; if(gaside==2) m->aux=-rockx; if(gaside==3) m->cnt=-rockz; */ if(t==OD_VAN1BOD3) { gaside=4; brk->hp=1; } rockx=0x300/2; rockz=0x600/2; if(t==OD_VAN1BOD2) { rockx=0x300; rockz=0x600; } if(gaside==0) m->aux= rockx; if(gaside==1) m->cnt= rockz; if(gaside==2) m->aux=-rockx; if(gaside==3) m->cnt=-rockz; if(--brk->hp<0) { if(m->type==OD_VAN1BOD) m->type=OD_VAN1BOD2; else if(m->type==OD_VAN2BODb) m->type=OD_VAN1BOD2; else m->type=OD_VAN1BOD3; brk->hp+=4; ang=m->xa; if(m->type==OD_VAN1BOD2) { play_sfx(SMP_CAR_DAM2,255,0x1800); x=m->x; y=0; z=m->z; slPushMatrix(); slUnitMatrix(CURRENT); slRotX(0x8000); slRotY(ang); for(i=0;i<24;i++) { t=(rand()&0x1ff)-0x100; t+=(t>>2); slCalcPoint( (-0xa0-(rand()&0x1f))<<16, 0, t<<16,dp); create_dust(OD_DUST2,x+dp[X],(-0x90-(rand()&127))<<16,z+dp[Z] ,rand()&3,0,0); t=(rand()&0x1ff)-0x100; slCalcPoint( ( 0xa0+(rand()&0x1f))<<16, 0, t<<16,dp); create_dust(OD_DUST2,x+dp[X],(-0x90-(rand()&127))<<16,z+dp[Z] ,rand()&3,0,0); } slPopMatrix(); } if(m->type==OD_VAN1BOD3) { if (manptr) manptr->ndestruct++; play_sfx(SMP_CAR_DAM3,255,0x1800); m++; m->type=OD_NULL; //SCORCH; x=m->x; y=0; z=m->z; slPushMatrix(); slUnitMatrix(CURRENT); slRotX(0x8000); slRotY(ang); ang-=0x4000; slCalcPoint( 0xac<<16,0, 0x120<<16,dq); i=create_item_ang(OD_VAN1WHLf,x+dq[X],0,z+dq[Z],ang); items[i].ya=0x4000; slCalcPoint( 0xac<<16,0,-0x110<<16,dq); i=create_item_ang(OD_VAN1WHLf,x+dq[X],0,z+dq[Z],ang); items[i].ya=0x4000; ang+=0x8000; slCalcPoint(-0xac<<16,0, 0x120<<16,dq); i=create_item_ang(OD_VAN1WHLf,x+dq[X],0,z+dq[Z],ang); items[i].ya=0x4000; slCalcPoint(-0xac<<16,0,-0x110<<16,dq); i=create_item_ang(OD_VAN1WHLf,x+dq[X],0,z+dq[Z],ang); items[i].ya=0x4000; slPopMatrix(); } } return(2); } int brk_handler_firebox(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr) { int i; int x,y,z; //create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]); player_rumble (manptr,RFX_CHUG); if(--brk->hp<0) { if (manptr) manptr->ndestruct++; play_sfx(SMP_CAR_DAM1, 255, 0x1800); x=m->x; y=m->y; z=m->z; m->type++; i=create_weapon(OD_FIREAXE,x,y,z,0); m=&items[i]; m->spd=64; m->ysp=0; make_glass2_frag(x-(0x30<<15),y if(level==LEVEL_11) { if(m->type==OD_PCARBOD3) wtype = OD_BAZOOKA; else wtype = OD_SHOTGUN1; slCalcPoint(0,0,0x100<<16,dq); i = create_weapon(wtype, x+dq[X], -0x50<<16, z+dq[Z] ,ang - 0x4000); mp = &items[i]; mp->spd = 70; mp->ysp = 96; mp->flg = 1; // No-detect flag. } else if(level==LEVEL_33) { if(m->z < 0) wtype = OD_PISTOL6; else wtype = OD_SHOTGUN1; slCalcPoint(0,0,0x100<<16,dq); i = create_weapon(wtype, x+dq[X], -0x50<<16, z+dq[Z] ,ang - 0x4000); mp = &items[i]; mp->spd = 70; mp->ysp = 96; mp->flg = 1; // No-detect flag. } m++; m->type=OD_NULL; slPopMatrix(); } } return(2); } int brk_handler_merc(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr) { int i,t; int x,y,z,ang; int rockx,rockz; int dq[4]; int xa; player_rumble (manptr,RFX_CHUG); if(manptr) xa=manptr->xa; else xa=0; /* if(brk->hp<0) { if(m->sfx!=0) { stop_sfx(m->sfx-1); m->sfx=0; } brk->dtype=BRK_SOLID; m->type=OD_CAR1EXP1+1; //(rand()&1); m->ysp=-128; m->cnt=1; m++; m->type=OD_SCORCH; x=m->x; y=m->y; z=m->z; manptr->ndestruct++; play_sfx(SMP_EXPLO1,255,0x1800); create_fx(OD_EXP1,x,dp[Y],z); create_fx(OD_BLAST1,x,0,z); for(i=0;i<16;i++) make_exp_frag(OD_WRECK1+(rand()&3),m->x,m->y,m->z); shaker=16; eflash=8; //16; return(2); } */ //create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]); for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa); t=m->type; if(dp[3]) play_sfx(SMP_MP_FH ,192,0x1800); else play_sfx(SMP_HAWK_P1,255,0x1800); if(t==OD_MERCBOD3) { gaside=4; brk->hp=1; } rockx=0x300/2; rockz=0x600/2; if(t==OD_MERCBOD2) { rockx=0x300; rockz=0x600; } if(gaside==0) m->aux= rockx; if(gaside==1) m->cnt= rockz; if(gaside==2) m->aux=-rockx; if(gaside==3) m->cnt=-rockz; if(--brk->hp<0) { if (temp_samples[0] != 0) stop_sfx(temp_samples[0] - 1), temp_samples[0] = 0; m->type++; brk->hp+=4; ang=m->xa; if(m->type==OD_MERCBOD2) { play_sfx(SMP_CAR_DAM2,255,0x1800); x=m->x; y=0; z=m->z; slPushMatrix(); slUnitMatrix(CURRENT); slRotX(0x8000); slRotY(ang); for(i=0;i<24;i++) { t=rand()&0xff; t+=(t>>3); slCalcPoint( (-0x90+t)<<16, 0, (-0xfc-0x40+(rand()&0x7f))<<16,dp); create_dust(OD_DUST,x+dp[X],-0xa0<<16,z+dp[Z] ,0,0,0); } for(i=0;i<16;i++) { t=rand()&0xff; t+=(t>>3); slCalcPoint( (-0x90+t)<<16, 0, ( 0xd8+(rand()&0x7f))<<16,dp); create_dust(OD_DUST,x+dp[X],-0xa0<<16,z+dp[Z] ,0,0,0); } slPopMatrix(); } if(m->type==OD_MERCBOD3) { if (manptr) manptr->ndestruct++; play_sfx(SMP_CAR_DAM3,255,0x1800); m++; m->type=OD_NULL; x=m->x; y=0; z=m->z; slPushMatrix(); slUnitMatrix(CURRENT); slRotX(0x8000); slRotY(ang); ang-=0x4000; slCalcPoint( 0x90<<16,0, 0xe8<<16,dq); i=create_item_ang(OD_MERCWHLf,x+dq[X],0,z+dq[Z],ang); items[i].ya=0x4000; slCalcPoint( 0x90<<16,0,-0xec<<16,dq); i=create_item_ang(OD_MERCWHLf,x+dq[X],0,z+dq[Z],ang); items[i].ya=0x4000; ang+=0x8000; slCalcPoint(-0x90<<16,0, 0xe8<<16,dq); i=create_item_ang(OD_MERCWHLf,x+dq[X],0,z+dq[Z],ang); items[i].ya=0x4000; slCalcPoint(-0x90<<16,0,-0xec<<16,dq); i=create_item_ang(OD_MERCWHLf,x+dq[X],0,z+dq[Z],ang); items[i].ya=0x4000; slPopMatrix(); } } return(2); } int brk_handler_traffic(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr) { int i,t; int xa; if(manptr) xa=manptr->xa; else xa=0; t=m->type; if(brk->hp<0) { brk->dtype=BRK_SOLID; if(t==OD_11PICKUP) m->type=OD_11PICEXP; if(t==OD_11JEEP) m->type=OD_11JEEPEXP; if(t==OD_11BUS) m->type=OD_11BUSEXP; if(t==OD_11CARRED) m->type=OD_11CAREXP; if(t==OD_11CARBLUE) m->type=OD_11CAREXP; if(t==OD_11POLICAR) m->type=OD_11CAREXP; if(t==OD_11TAXI) m->type=OD_11CAREe==OD_61A10a) { i = create_weapon(OD_BGUN1, -312<<19, -0xf0<<16, -488<<19 ,0x4000); mp = &items[i]; mp->spd = 64; mp->ysp = 64; mp->flg = 1; m++; m->type = OD_NULL; } if(type==OD_61ARMYTRCK && trmob==m && m->aux) { m->aux = 0; baddie_pause = 0; } } } return(1); } int brk_handler_forklift(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr) { int i; int xa; if(manptr) xa=manptr->xa; else xa=0; //create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]); if(--brk->hp<0) { if (manptr) manptr->ndestruct++; brk->dtype=BRK_NULL; m->type=OD_NULL; play_sfx(SMP_EXPLO1,255,0x1800); create_fx(OD_EXP_M,m->x,-0x20<<16,m->z); shaker=16; eflash=4; for(i=0;i<8;i++) make_exp_frag(OD_WRECK1+(rand()&3),m->x,m->y,m->z); baddie_pause = 0; } for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa); if(dp[3]) play_sfx(SMP_MP_FH ,192,0x1800); else play_sfx(SMP_HAWK_P1,255,0x1800); return(2); } int brk_handler_car(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr) { int i,t; int x,y,z,ang; int rockx,rockz; int wtype; int dq[4]; int xa; MOB *mp; player_rumble (manptr,RFX_CHUG); if(manptr) xa=manptr->xa; else xa=0; if(brk->hp<0) { if(m->sfx!=0) { stop_sfx(m->sfx-1); m->sfx=0; } brk->dtype=BRK_SOLID; m->type=OD_CAR1EXP1+1; //(rand()&1); m->ysp=-128; m->cnt=1; m++; m->type=OD_SCORCH; x=m->x; y=m->y; z=m->z; if (manptr) manptr->ndestruct++; play_sfx(SMP_EXPLO1,255,0x1800); create_fx(OD_EXP1,x,dp[Y],z); create_fx(OD_BLAST1,x,0,z); for(i=0;i<16;i++) make_exp_frag(OD_WRECK1+(rand()&3),m->x,m->y,m->z); shaker=16; eflash=8; //16; return(2); } //create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]); for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa); t=m->type; if(dp[3]) play_sfx(SMP_MP_FH ,192,0x1800); else play_sfx(SMP_HAWK_P1,255,0x1800); if(t==OD_CAR1BOD3 OR t==OD_PCARBOD3) { gaside=4; brk->hp=1; } else { if(level==LEVEL_11 OR level==LEVEL_31) { if(m->sfx==0) m->sfx=1+play_sfx(SMP_L_CARAL,255,0x1800); // do alarm for 10 secs. m->ysp=10*30; } } rockx=0x300/2; rockz=0x600/2; if(t==OD_CAR1BOD2 OR t==OD_PCARBOD2) { rockx=0x300; rockz=0x600; } if(gaside==0) m->aux= rockx; if(gaside==1) m->cnt= rockz; if(gaside==2) m->aux=-rockx; if(gaside==3) m->cnt=-rockz; if(--brk->hp<0) { m->type++; brk->hp+=4; ang=m->xa; if(m->type==OD_CAR1BOD2 OR m->type==OD_PCARBOD2) { play_sfx(SMP_CAR_DAM2,255,0x1800); x=m->x; y=0; z=m->z; slPushMatrix(); slUnitMatrix(CURRENT); slRotX(0x8000); slRotY(ang); for(i=0;i<24;i++) { t=rand()&0xff; t+=(t>>3); slCalcPoint( (-0x90+t)<<16, 0, (-0xfc-0x40+(rand()&0x7f))<<16,dp); create_dust(OD_DUST,x+dp[X],-0xa0<<16,z+dp[Z] ,0,0,0); } for(i=0;i<16;i++) { t=rand()&0xff; t+=(t>>3); slCalcPoint( (-0x90+t)<<16, 0, ( 0xd8+(rand()&0x7f))<<16,dp); create_dust(OD_DUST,x+dp[X],-0xa0<<16,z+dp[Z] ,0,0,0); } slPopMatrix(); } if(m->type==OD_CAR1BOD3 OR m->type==OD_PCARBOD3) { if (manptr) manptr->ndestruct++; play_sfx(SMP_CAR_DAM3,255,0x1800); x=m->x; y=0; z=m->z; slPushMatrix(); slUnitMatrix(CURRENT); slRotX(0x8000); slRotY(ang); slCalcPoint( 0,0,-0x108<<16,dq); i=create_item_ang(OD_CAR1ENG2,x+dq[X],0,z+dq[Z],ang); ang-=0x4000; slCalcPoint( 0x90<<16,0, 0xd8<<16,dq); i=create_item_ang(OD_CAR1WHLf,x+dq[X],0,z+dq[Z],ang); items[i].ya=0x4000; slCalcPoint( 0x90<<16,0,-0xfc<<16,dq); i=create_item_ang(OD_CAR1WHLf,x+dq[X],0,z+dq[Z],ang); items[i].ya=0x4000; ang+=0x8000; slCalcPoint(-0x90<<16,0, 0xd8<<16,dq); i=create_item_ang(OD_CAR1WHLf,x+dq[X],0,z+dq[Z],ang); items[i].ya=0x4000; slCalcPoint(-0x90<<16,0,-0xfc<<16,dq); i=create_item_ang(OD_CAR1WHLf,x+dq[X],0,z+dq[Z],ang); items[i].ya=0x4000; type==OD_63PIPE2 OR type==OD_63PIPE3 OR type==OD_63PIPE4 OR type==OD_71PIPE1) { brk->dtype=BRK_SOLID; if (manptr) manptr->ndestruct++; play_sfx(SMP_EXPLO1,192,0x1800); y=-0x80-0x20; if(type==OD_63PIPE3 OR type==OD_63PIPE4 OR type==OD_71PIPE1) y = -0x100-0x20; create_fx(OD_EXP_S,m->x,y<<16,m->z); if(m->x > 0) ang = 0x200; else ang = 0x600; for(i=0;i<8;i++) make_exp_frag_ang(OD_WRECK1+(rand()&3),m->x,y<<15,m->z,ang); shaker=8; eflash=4; } } return(1); } int brk_handler_explode(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr) { int i; int x,y,z; int type; int xa; int exptyp; int va; MOB *mp; if(manptr) xa=manptr->xa; else xa=0; type = m->type; x = m->x; y = m->y; z = m->z; player_rumble (manptr,RFX_CHUG); //create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]); play_sfx(SMP_CAR_LAND,0xff,0x1800); for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa); if(--brk->hp<0) { brk->dtype=BRK_NULL; m->type=OD_NULL; if (manptr) manptr->ndestruct++; play_sfx(SMP_EXPLO1,255,0x1800); create_fx(OD_EXP_M ,x ,-0x20<<16 ,z); shaker=16; eflash=4; dual_rumble (RFX_EXP); exptyp = 0; if (brk->xtflags & 8) { if (rand() & 1) va = OD_GRENADE; else va = OD_DYNAMITE; i=create_weapon(va,x,-0x50<<16,z, 0x4000-0x1000+(rand()&0x1fff) ); mp=&items[i]; mp->spd=50+(rand()&15); mp->ysp=60+(rand()&15); mp->flg=1; mp->cnt = 3*30; } else { if ( (difflevel == 0 && brk->xtflags & 1) || (difflevel == 1 && brk->xtflags & 2) || (difflevel == 2 && brk->xtflags & 4) ) { if(type == OD_CRATEhealth ) { create_weapon(OD_PUPhealth+(rand()%3) ,x ,0 ,z ,0); exptyp = 1; } if(type == OD_CRATEpistol ) { create_weapon(OD_PISTOL2 ,x ,0 ,z ,0); exptyp = 1; } if(type == OD_CRATEshotgun ) { create_weapon(OD_SHOTGUN1 ,x ,0 ,z ,0); exptyp = 1; } if(type == OD_CRATEgrenade ) { create_weapon(OD_GRENADE ,x ,0 ,z ,0); exptyp = 1; } if(type == OD_CRATEdynamite ) { create_weapon(OD_DYNAMITE ,x ,0 ,z ,0); exptyp = 1; } if(type == OD_CRATEflare ) { create_weapon(OD_FLAREGUN ,x ,0 ,z ,0); exptyp = 1; } if (type == OD_33BARRIER1) { exptyp = 1; } if (exptyp) { for(i=0;i<8;i++) make_exp_frag_blacksmoke (OD_SMFRAG1+(rand()&3), x, y, z); } else { for(i=0;i<8;i++) make_exp_frag(OD_WRECK1+(rand()&3), x, y, z); } } } } else { m->cnt=16; } return(1); } int brk_handler_damaged(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr) { int i,j; int type; int ang; MOB *mp; int xa; if(manptr) xa=manptr->xa; else xa=0; //create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]); for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa); play_sfx(SMP_CAR_LAND,0xff,0x1800); m->cnt=16; if(--brk->hp<0) { type=m->type; m->type++; if(type==OD_63PILDESK1 OR type==OD_63PILDESK2 OR type==OD_63PILDESK3 OR type==OD_63PILOTCHR) { brk->hp = 4; play_sfx(SMP_CAR_DAM2,255,0x1800); } else { brk->dtype=BRK_SOLID; if (manptr) manptr->ndestruct++; play_sfx(SMP_EXPLO1,255,0x1800); create_fx(OD_EXP_M,m->x,-0x40<<16,m->z); shaker=16; eflash=4; for(i=0;i<8;i++) make_exp_frag(OD_WRECK1+(rand()&3),m->x,m->y,m->z); m->cnt=0; m->aux=30*8; if(type==OD_31HDOGSTND) { for(j=0; j < 4; j++) { i=create_weapon(OD_PUPhotdog, m->x, -0x80<<16, m->z, rand() << 1); mp=&items[i]; mp->spd=50+(rand()&15); mp->ysp=60+(rand()&15); mp->flg=1; // No-detect flag. } } if(type==OD_64GUNSTND1 OR type==OD_64GUNSTND2) { if(m->x > 0) ang = -0x4000; else ang = 0x4000; i = create_weapon(OD_FLAREGUN, m->x, -0x100<<16, m->z ,ang); mp = &items[i]; mp->spd = 32; mp->flg = 1; } if(typrand()&0x1fff); } m->type=OD_NULL; return; } } } //**************************************************************************** //char err1[40], err2[40], err3[40]; void damage_player_sub(int hitter, int struck, int damage) { ANIM *phitter; ANIM *pstruck = ply + struck; int hm, dm; if(struck < 0 OR struck >= MAXCHARS) return; if (damage > 0) { phitter = ply + hitter; if ((hitter < FIRSTBAD) && (struck >= FIRSTBAD)) { hm = 256 + ((1 - difflevel) << 7); hm = (phitter->intelligence[phitter->intelligence_level].hit_mul * hm) >> 8; } else if ((hitter >= FIRSTBAD) && (struck < FIRSTBAD)) { hm = 256 - ((1 - difflevel) << 7); hm = (phitter->intelligence[phitter->intelligence_level].hit_mul * hm) >> 8; } else { hm = phitter->intelligence[phitter->intelligence_level].hit_mul; } if (hm < 1) hm = 1; damage = (damage * hm) >> 8; } else { damage = -damage; phitter = 0; } dm = pstruck->intelligence[pstruck->intelligence_level].damage_mul; damage = (damage * dm) >> 8; if(damage < 1) damage = 1; if(phitter) phitter->manhit = struck; pstruck->phitter = hitter; pstruck->damage += damage; if ((gametype == 2) OR (struck >= FIRSTBAD) OR !(cheattype & CHEAT_INVULNERABLE)) { pstruck->health -= damage; if (pstruck->health < 0) pstruck->health=0; } if (pstruck->plygrab != -1) { ply[(int)pstruck->plygrab].grabbed = -1; pstruck->plygrab = -1; } } void anim_damage_player(int hitter, int struck, int anum) { int damage; int n; if ((hitter < 0) OR (hitter > MAXCHARS) OR (struck < 0) OR (struck > MAXCHARS)) { return; } damage = animflag[anum]; n = ply[hitter].modnum; if (n == OD_HAWK ) damage = animflag_hw[anum]; else if (n == OD_MACE ) damage = animflag_mc[anum]; else if (n == OD_SMASHER ) damage = animflag_sm[anum]; else if (n == OD_ALANA ) damage = animflag_al[anum]; damage >>= 8; damage_player_sub(hitter, struck, damage); } void object_damage_player(int hitter, int struck, int object) { int damage=0; if (hitter < 0) return; if(object == OD_MISSILE1 OR object == OD_FLARE OR object == OD_BLAST2) { damage = 64; } else if ((object == OD_31CAFESEAT) || (object == OD_31CAFSEAT1) || (object == OD_31CAFSEAT2) || (object == OD_31CAFSEAT3) || (object == OD_71DSKCHAIR)) { damage = 32; } else if ((object < OD_WEAPSTART) OR (object > OD_WEAPEND) OR (hitter < 0) OR (hitter > MAXCHARS) OR (struck < 0) OR (struck > MAXCHARS)) { return; } else { damage = weapon_type[object - OD_WEAPSTART] >> 16; } if(damage < 0) damage = 0; damage_player_sub(hitter, struck, damage); } //**************************************************************************** int brk_handler_null(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr) { return(0); } int brk_handler_break(BRKOBJ *brk,MOB *m,int *dp,ANIM *manptr) { int i,y,ang; int type; int xa; if(manptr) xa=manptr->xa; else xa=0; type=m->type; m->cnt=16; //create_hitspr(OD_HIT,dp[X],dp[Y],dp[Z]); play_sfx(SMP_21SUSP,160,0x1800); player_rumble (manptr,RFX_CHUG); // for(i=0;i<8;i++) make_spark_fx(dp[X],dp[Y],dp[Z],xa); if(--brk->hp<0) { m->type++; if(type==OD_41ELECKART OR type==OD_41TRAILER1) { brk->dtype=BRK_SOLID; if (manptr) manptr->ndestruct++; play_sfx(SMP_EXPLO1,255,0x1800); create_fx(OD_EXP_M,m->x,-0x40<<16,m->z); shaker=16; eflash=4; for(i=0;i<8;i++) make_exp_frag(OD_WRECK1+(rand()&3),m->x,-0x40<<16,m->z); } if(type==OD_41TURNSTLE OR type==OD_41TURNSTLE2) { m->type=OD_41TURNSTLEx; if (manptr) manptr->ndestruct++; play_sfx(SMP_EXPLO1,192,0x1800); create_fx(OD_EXP_S,m->x,-0x80<<16,m->z); shaker=8; eflash=4; manptr->px += 4 << 19; // FRIG!! brk->x1 = brk->x2 = (m->x >> 16) + (4 << 3); brk->z1 = brk->z2 = m->z >> 16; is_breakable(brk,OD_41TURNSTLEx); nbrk--; } if(type==OD_63PIPE1 OR